home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************/
- /* This header contains implementation of sorting procedures */
- /* */
- /* E.Podvoysky from ^Z for WROX press book, 1994 */
- /************************************************************************/
-
- #include <mem.h>
- #include "palsort.h"
-
- less_func *less;
- ptr_array pointer_array;
-
-
- void sort(int l, int r) {
- int i, j;
- void *x, *y;
-
- i = l;
- j = r;
- x = pointer_array[(l + r) >> 1]; // middle of array
- do {
- while (less(pointer_array[i], x)) i++;
- while (less(x, pointer_array[j])) j--;
- if (i <= j) { // sic! , let i become > j!
- y = pointer_array[i]; // swap pointers with indexes i and j
- pointer_array[i] = pointer_array[j];
- pointer_array[j] = y;
- i++;
- j--;
- }
- } while (i <= j);
- if (l < j) sort(l, j);
- if (i < r) sort(i, r);
- }
-
- void quicksort( ptr_array ptrarr, less_func less_fun, int l, int r) {
- pointer_array = ptrarr;
- less = less_fun;
- sort( l,r);
- }
-
- BOOL long_less(void *p1, void *p2) {
- return *((long *)p1) < *((long *)p2);
- }
-
- void sort_palette_bright( BGRpalette &pal, int colors) {
- long *values;
- int j,num;
- long **pointers;
- BGRpalette *tmp;
-
- values = new long[256];
- pointers = new long * [256];
- for (j = 0; j < 256; j++) values[j] =
- (pal[j].r * 299L + pal[j].g * 587L + pal[j].b * 114L );
-
- for (j = 0; j < 256; j++) pointers[j] = values+j;
-
- quicksort( (ptr_array) pointers, long_less, 0, colors-1);
-
- tmp = new BGRpalette[1];
- for (j = 0; j < colors-1; j++) {
- num = pointers[j] - values;
- (*tmp)[j] = pal[num];
- }
- memcpy(&pal, tmp, sizeof(BGRcolortype)*colors);
- delete tmp;
- delete values;
- delete pointers;
- };
-
-